import json
import random


from django.http import HttpResponse, JsonResponse
from django.shortcuts import render

# Create your views here.
from django.views import View
from django_redis import get_redis_connection
from redis import Redis
from ronglian_sms_sdk import SmsSDK

from libs.captcha.captcha import captcha
from utils.smsutiils import SmsUtil
from celery_tasks.sms.tasks import send_sms_code

class ImageCodeView(View):
    def get(self,request,uuid):
        # 接收前段请求 uuid
        # 生成验证码
        text,image = captcha.generate_captcha()
        print(text)
        # 用uuid为key 验证码为value 存到redis
        redis=get_redis_connection('code')
        # redis.set(uuid,text)
        # 验证码添加有效期 这个是300秒
        redis.setex(uuid,300, text)
        # 把验证码的图片 返回给前端
        return HttpResponse(image,content_type='image/jpeg')




class SmsView(View):
    def get(self,request,mobile):

        # 校验手机号格式是否正确
        if not mobile:
            return JsonResponse({'code':300,'errmsg':'手机号为空'})

        # 正则验证

        # 校验图片验证码是否正确
        image_code=request.GET.get('image_code')
        image_code_uuid=request.GET.get('image_code_id')

        try:

            # 获取保存都在redis里的图片验证码
            redis: Redis = get_redis_connection('code')
            print(redis)
            image_code_redis = redis.get(image_code_uuid)
            if not image_code_redis:
                return JsonResponse({'code':400,'errmsg':'验证码过期'})
            image_code_redis = image_code_redis.decode()
            print('image_code_redis', image_code_redis)

            if image_code.lower() != image_code_redis.lower():
                return JsonResponse({'code':500,'errmsg':'图片验证码错了'})
        except Exception as e:
            print(e)
            return JsonResponse({'code':600,'errmsg':'网络异常'})


        # 1.先根据key: flag_手机号，获取值
        flag_send=redis.get('flag_%s' % mobile)

        # 2.如果值存在，返回错误响应 过于频繁发送
        if flag_send:
            return  JsonResponse({'code':110,'errmsg':'短信已发送，请稍后再试'})
        # 3.如果不存在 就可以继续发送短信验证码
        # 生成短信验证码
        sms_code='%06d'% random.randint(0,999999)
        #  给这个手机号发送短信 第三方
        print('发送短信给',mobile)
        # 短信验证码
        print('短信验证码=',sms_code)
        # 同步发短信
        # SmsUtil().send_message(mobile=mobile,code=sms_code)
        # 异步发送短信
        print('发短信111')

        send_sms_code.delay(mobile=mobile,code=sms_code)
        print('发短信222')
        # 1.创建redis的管道 pipeline 对象(目的：减少性能损耗)
        pl=redis.pipeline()

        # 2.把 redis 的操作请求 添加到管道
        pl.setex('smscode_%s'% mobile,60*3,sms_code)
        pl.setex('flag_%s' % mobile,120,1)

        # 3.执行所有操作
        pl.execute()



        # redis.setex('smscode_%s'%mobile,60*3,sms_code)

        # 4.发送完 保存 key:手机号 value:1 有效期 60 秒 （和前段的倒计时一致）
        # redis.setex('flag_%s' % mobile,60,1)



        # 返回响应0
        return JsonResponse({'code':0,'errmsg':'ok'})



